/**
  @file     	DESIGNPATTERN_BridgeImp.h 
  @brief    	1.When the algorithm to create complex object should be independent of the part of the object, 
                  as well as their assembly;
				2.When construction process must be allowed to construct the object is different;
  @author  	arvin
  @version 	1.0   2012/12/20
 */

#ifndef CXX_DESIGNPATTERN_BRIDGEIMP_H
#define CXX_DESIGNPATTERN_BRIDGEIMP_H
#include "ProductDef.h"

class AbstractBridgeImp
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return 
	*/
	virtual ~AbstractBridgeImp();

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	*/
	virtual VOID Operation() = 0;

	/**
	* GetManufacturer
	*
	* @param VOID
	* @return MANUFACTURER_TYPE
	*/
	MANUFACTURER_TYPE GetManufacturer();
protected:
	/**
	* Construction
	*
	* @param MANUFACTURER_TYPE eManufacturer
	* @return 
	*/
	AbstractBridgeImp(MANUFACTURER_TYPE eManufacturer);

	/**
	* SetManufacturer
	*
	* @param MANUFACTURER_TYPE eManufacturer
	* @return
	*/
	VOID SetManufacturer(MANUFACTURER_TYPE eManufacturer);

private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	AbstractBridgeImp();

	/**
	* Copy Construction
	*
	* @param const AbstractBridgeImp& cBridgeImp
	* @return 
	*/
	AbstractBridgeImp(const AbstractBridgeImp& cBridgeImp);

	/**
	* Assignment
	*
	* @param const AbstractBridgeImp& cBridgeImp
	* @return AbstractBridgeImp&
	*/
	AbstractBridgeImp& operator=(const AbstractBridgeImp& cBridgeImp);

public:
protected:
private:
	MANUFACTURER_TYPE m_eManufacturer;
};

class DELLBridgeImp : public AbstractBridgeImp
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return 
	*/
	virtual ~DELLBridgeImp();

	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	DELLBridgeImp();
protected:
private:

	/**
	* Copy Construction
	*
	* @param const DELLBridgeImp& cDELLBridgeImp
	* @return 
	*/
	DELLBridgeImp(const DELLBridgeImp& cDELLBridgeImp);

	/**
	* Assignment
	*
	* @param const DELLBridgeImp& cDELLBridgeImp
	* @return DELLBridgeImp&
	*/
	DELLBridgeImp& operator=(const DELLBridgeImp& cDELLBridgeImp);

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	*/
	VOID Operation();

public:
protected:
private:
};


class ASUSBridgeImp : public AbstractBridgeImp
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~ASUSBridgeImp();

	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	ASUSBridgeImp();
protected:
private:

	/**
	* Copy Construction
	*
	* @param const ASUSBridgeImp& cASUSBridgeImp
	* @return
	*/
	ASUSBridgeImp(const ASUSBridgeImp& cASUSBridgeImp);

	/**
	* Assignment
	*
	* @param const ASUSBridgeImp& cASUSBridgeImp
	* @return ASUSBridgeImp&
	*/
	ASUSBridgeImp& operator=(const ASUSBridgeImp& cASUSBridgeImp);

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	*/
	VOID Operation();

public:
protected:
private:
};


class HPBridgeImp : public AbstractBridgeImp
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~HPBridgeImp();

	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	HPBridgeImp();
protected:
private:

	/**
	* Copy Construction
	*
	* @param const HPBridgeImp& cHPBridgeImp
	* @return
	*/
	HPBridgeImp(const HPBridgeImp& cHPBridgeImp);

	/**
	* Assignment
	*
	* @param const HPBridgeImp& cHPBridgeImp
	* @return HPBridgeImp&
	*/
	HPBridgeImp& operator=(const HPBridgeImp& cHPBridgeImp);

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	*/
	VOID Operation();

public:
protected:
private:
};

#endif	/* >>CXX_DESIGNPATTERN_BRIDGEIMP_H<< */
/* EOF */